/*
 * copiarArchivo.c
 *
 *  Created on: 09/07/2012
 *      Author: utnso
 */

#include <stdint.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

int32_t main(int32_t argc, char** argv) {
	if (argc >= 3) {
		char* pathOrigen = malloc(strlen(argv[1]) + 1);
		strcpy(pathOrigen, argv[1]);
		char* pathDestino = malloc(strlen(argv[2]) + 1);
		strcpy(pathDestino, argv[2]);
		int32_t fpOrigen = open(pathOrigen, O_RDONLY, 0600);
		if (fpOrigen != -1) {
			int32_t fpDestino = open(pathDestino, O_WRONLY, 0600);
			if(fpDestino != -1){
				uint32_t tamanioOrigen = lseek(fpOrigen, 0, SEEK_END);
				lseek(fpOrigen, 0, SEEK_SET);
				//uint32_t tamanioDestino = lseek(fpDestino, 0, SEEK_END);
				lseek(fpDestino, 0, SEEK_SET);
				uint32_t sizeCopiado = 20000;
				uint32_t desplazamiento = 0;
				char* cadena = malloc(sizeCopiado);
				while(desplazamiento + sizeCopiado <= tamanioOrigen){
					memset(cadena, '\0', sizeCopiado);
					read(fpOrigen, cadena, sizeCopiado);
					write(fpDestino, cadena, sizeCopiado);
					desplazamiento += sizeCopiado;
				}
				free(cadena);
				if(desplazamiento < tamanioOrigen){
					sizeCopiado = tamanioOrigen - desplazamiento;
					cadena = malloc(sizeCopiado);
					memset(cadena, '\0', sizeCopiado);
					read(fpOrigen, cadena, sizeCopiado);
					write(fpDestino, cadena, sizeCopiado);
					free(cadena);
				}
				close(fpOrigen);
				close(fpDestino);
			}else{
				close(fpOrigen);
				printf("El archivo %s no pudo ser abierto.\n", pathDestino);
			}
		} else {
			printf("El archivo %s no pudo ser abierto.\n", pathOrigen);
		}
		free(pathOrigen);
		free(pathDestino);
	} else {
		printf("Faltan argumentos necesarios para la ejecucion del programa.\n");
		printf("Argumentos necesarios:\n");
		printf("     -Path de origen.\n");
		printf("     -Path de destino.\n");
	}
	return 0;
}
